package com.tdam2011.grupo02.data;

import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.Date;

import com.tdam2011.grupo02.appwidget.backup.MsgwWidgetContact_backup;
import com.tdam2011.grupo02.connectivity.Connectivity;
import com.tdam2011.grupo02.domain.ContactLocation;
import com.tdam2011.grupo02.domain.Mail;
import com.tdam2011.grupo02.domain.MensajeWeb;
import com.tdam2011.grupo02.domain.Usuario;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {

	// Nombres de DB y tablas
	private static final String nombreDB = "comDroidDB";
	private static final String tbMensajesWeb = "mensajes_web_log";
	private static final String tbContactosTelefono = "contactos_telefono";
	private static final String tbUsuarios = "usuarios";
	private static final String tbConectividad = "conectividad";
	private static final String tbMails = "mails";
	private static final String tbFechaUltimoMsgwRecibido = "fecha_ultimo_msgw_recibido";

	// Columnas de tabla tbMensajesWeb
	private static final String colIdMsgw = "_id";
	private static final String colMsgwTipo = "tipo";
	private static final String colMsgwFecha = "fecha";
	private static final String colMsgwMensaje = "mensaje";
	private static final String colMsgwContacto = "id_contacto";
	private static final String colMsgwOutbox = "outbox";
	private static final String colMsgwLatitude = "latitude";
	private static final String colMsgwLongitude = "longitude";
	private static final String colMsgwAddress = "address";

	// Columnas de tabla tbContactosTelefono
	private static final String colIdCT = "numero";
	private static final String colContactoCT = "id_contacto";

	// Columnas de tabla tbUsuarios
	private static final String colIdUsuario = "_id";
	private static final String colPassword = "contrasenia";
	private static final String colNombreCompleto = "nombre_completo";
	private static final String colMail = "mail";
	private static final String colFechaNacimiento = "fecha_nacimiento";

	// Columnas de tabla tbConectividad
	private static final String colIdConectividad = "_id";
	private static final String colConeccion = "coneccion";
	private static final String colStatus = "status";
	private static final String colConectividadFecha = "fecha";
	private static final String colConectividadHora = "hora";

	// Columnas de tabla tbMails
	private static final String colIdMail = "_id";
	private static final String colMailContacto = "contacto";
	private static final String colMailContactoMail = "contacto_mail";
	private static final String colMailFecha = "fecha";

	// Tabla que contiene la fecha del ultimo mensaje web recibido
	private static final String colFechaUltimoMsgwRecibido = "fecha";

	public DatabaseHelper(Context context) {
		super(context, nombreDB, null, 16);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {

		// Tabla usuarios
		db.execSQL("CREATE TABLE IF NOT EXISTS " + tbUsuarios + " ( "
				+ colIdUsuario + " TEXT PRIMARY KEY, " + colPassword
				+ " TEXT NOT NULL, " + colNombreCompleto + " TEXT NOT NULL, "
				+ colFechaNacimiento + " DATE NOT NULL," + colMail
				+ " TEXT NOT NULL )");

		// Tabla msgw_log
		db.execSQL("CREATE TABLE IF NOT EXISTS " + tbMensajesWeb + " ( "
				+ colIdMsgw + " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+ colMsgwFecha + " INTEGER NOT NULL," + colMsgwMensaje
				+ " TEXT NOT NULL, " + colMsgwContacto + " TEXT, "
				+ colMsgwTipo + " SHORT NOT NULL, " + colMsgwOutbox
				+ " INTEGER NOT NULL, " + colMsgwLatitude + " TEXT, "
				+ colMsgwLongitude + " TEXT, " + colMsgwAddress + " TEXT )");

		// Tabla contacto_telefono
		db.execSQL("CREATE TABLE IF NOT EXISTS " + tbContactosTelefono + " ( "
				+ colIdCT + " INTEGER PRIMARY KEY, " + colContactoCT
				+ " INTEGER NOT NULL )");

		// Tabla conectividad
		db.execSQL("CREATE TABLE IF NOT EXISTS " + tbConectividad + " ( "
				+ colIdConectividad + " INTEGER PRIMARY KEY AUTOINCREMENT, "
				+ colConeccion + " TEXT NOT NULL, " + colStatus
				+ " TEXT NOT NULL, " + colConectividadFecha
				+ " TEXT NOT NULL, " + colConectividadHora + " TEXT NOT NULL )");

		// Tabla mails
		db.execSQL("CREATE TABLE IF NOT EXISTS " + tbMails + " ( " + colIdMail
				+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + colMailContacto
				+ " TEXT NOT NULL, " + colMailContactoMail + " TEXT NOT NULL, "
				+ colMailFecha + " INTEGER NOT NULL )");

		db.execSQL("CREATE TABLE IF NOT EXISTS " + tbFechaUltimoMsgwRecibido
				+ " ( " + colFechaUltimoMsgwRecibido + " INTEGER NOT NULL )");

		loadInitData(db);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("DROP TABLE IF EXISTS " + tbMensajesWeb);
		onCreate(db);
	}

	// Testing Mensajes Web

	private void loadInitData(SQLiteDatabase db) {
		ContentValues cv = null;
		Date date = null;

		date = new Date(112, 4, 1, 10, 10, 45);
		cv = new ContentValues();
		cv.put(colMsgwContacto, "pepe");
		cv.put(colMsgwFecha, date.getTime());
		cv.put(colMsgwMensaje, "hola! como andas!");
		cv.put(colMsgwTipo, MensajeWeb.TYPE_RECEIVED);
		cv.put(colMsgwOutbox, MensajeWeb.TYPE_INBOX);
		db.insert(tbMensajesWeb, null, cv);

		date = new Date(112, 4, 1, 10, 20, 45);
		cv = new ContentValues();
		cv.put(colMsgwContacto, "pepe");
		cv.put(colMsgwFecha, date.getTime());
		cv.put(colMsgwMensaje, "hola! bien y vos!");
		cv.put(colMsgwTipo, MensajeWeb.TYPE_SENT);
		cv.put(colMsgwOutbox, MensajeWeb.TYPE_INBOX);
		db.insert(tbMensajesWeb, null, cv);

		date = new Date(112, 4, 1, 11, 8, 40);
		cv = new ContentValues();
		cv.put(colMsgwContacto, "pepe");
		cv.put(colMsgwFecha, date.getTime());
		cv.put(colMsgwMensaje, "bien! aca programando un rato");
		cv.put(colMsgwTipo, MensajeWeb.TYPE_RECEIVED);
		cv.put(colMsgwOutbox, MensajeWeb.TYPE_INBOX);
		db.insert(tbMensajesWeb, null, cv);

		date = new Date(112, 5, 1, 16, 45, 40);
		cv = new ContentValues();
		cv.put(colMsgwContacto, "chiqui");
		cv.put(colMsgwFecha, date.getTime());
		cv.put(colMsgwMensaje, "hola! todo bien?");
		cv.put(colMsgwTipo, MensajeWeb.TYPE_SENT);
		cv.put(colMsgwOutbox, MensajeWeb.TYPE_INBOX);
		db.insert(tbMensajesWeb, null, cv);

		date = new Date(112, 5, 1, 20, 10, 45);
		cv = new ContentValues();
		cv.put(colMsgwContacto, "chiqui");
		cv.put(colMsgwFecha, date.getTime());
		cv.put(colMsgwMensaje, "bien y vos! :D");
		cv.put(colMsgwTipo, MensajeWeb.TYPE_RECEIVED);
		cv.put(colMsgwOutbox, MensajeWeb.TYPE_INBOX);
		db.insert(tbMensajesWeb, null, cv);

		date = new Date(112, 5, 1, 21, 45, 40);
		cv = new ContentValues();
		cv.put(colMsgwContacto, "chiqui");
		cv.put(colMsgwFecha, date.getTime());
		cv.put(colMsgwMensaje, "hola! probando outbox");
		cv.put(colMsgwTipo, MensajeWeb.TYPE_SENT);
		cv.put(colMsgwOutbox, MensajeWeb.TYPE_OUTBOX);
		db.insert(tbMensajesWeb, null, cv);

		date = new Date(112, 5, 1, 22, 45, 40);
		cv = new ContentValues();
		cv.put(colMsgwContacto, "chiqui");
		cv.put(colMsgwFecha, date.getTime());
		cv.put(colMsgwMensaje, "hola! te llegan los msgw??");
		cv.put(colMsgwTipo, MensajeWeb.TYPE_SENT);
		cv.put(colMsgwOutbox, MensajeWeb.TYPE_OUTBOX);
		db.insert(tbMensajesWeb, null, cv);

		Cursor cursor = db.rawQuery("SELECT * FROM "
				+ tbFechaUltimoMsgwRecibido, null);
		if (!cursor.moveToFirst()) {
			date = new Date(112, 1, 1, 00, 00, 00);
			cv = new ContentValues();
			cv.put(colFechaUltimoMsgwRecibido, date.getTime());
			db.insert(tbFechaUltimoMsgwRecibido, null, cv);
		}
	}

	// USUARIOS

	public synchronized boolean addUser(Usuario user) {
		deleteAllUsers();
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		Long r;

		cv.put(colIdUsuario, user.get_id());
		cv.put(colPassword, user.getPassword());
		cv.put(colNombreCompleto, user.getNombreCompleto());
		cv.put(colFechaNacimiento, user.getFechaNacimiento().toString());
		cv.put(colMail, user.getMail());

		r = db.insert(tbUsuarios, colIdUsuario, cv);
		db.close();

		if (r == -1)
			return false;
		return true;
	}

	public synchronized Usuario getUser(int id, String password) {
		Usuario user = new Usuario();
		return user;
	}

	public synchronized boolean existsUser(Usuario user) {
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cur = db.rawQuery("SELECT " + colIdUsuario + " from "
				+ tbUsuarios + " WHERE ( " + colIdUsuario + " =? AND "
				+ colPassword + " =? )",
				new String[] { user.get_id(), user.getPassword() });
		boolean result;

		if (cur.moveToFirst())
			result = true;
		else
			result = false;

		cur.close();
		db.close();

		return result;
	}

	public synchronized Usuario getUsuario() {
		Usuario user = new Usuario();

		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cur = db.rawQuery("SELECT * from " + tbUsuarios, null);

		if (cur.moveToFirst()) {
			user.set_id(cur.getString(cur.getColumnIndex(colIdUsuario)));
			user.setPassword((cur.getString(cur.getColumnIndex(colPassword))));
			user.setNombreCompleto((cur.getString(cur
					.getColumnIndex(colNombreCompleto))));
			user.setMail((cur.getString(cur.getColumnIndex(colMail))));
			user.setFechaNacimiento(cur.getString(cur
					.getColumnIndex(colFechaNacimiento)));
		}

		cur.close();
		db.close();

		return user;
	}

	public synchronized void deleteAllUsers() {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(tbUsuarios, null, new String[] {});
		db.close();
	}

	// CONECTIVIDAD

	public synchronized boolean addConnectivity(Connectivity conn) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		long r;

		cv.put(colConeccion, conn.getConnection());
		cv.put(colStatus, conn.getStatus());
		cv.put(colConectividadFecha, conn.getFecha());
		cv.put(colConectividadHora, conn.getHora());

		r = db.insert(tbConectividad, colConeccion, cv);
		db.close();

		if (r != -1)
			return false;
		return true;
	}

	public synchronized void deleteConnectivity(Connectivity conn) {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(tbUsuarios, "_id = ?",
				new String[] { String.valueOf(conn.get_id()) });
		db.close();
	}

	public synchronized LinkedList<Connectivity> getAllConnectivityInfo() {
		LinkedList<Connectivity> conn = new LinkedList<Connectivity>();
		Connectivity aux = null;
		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery("SELECT * FROM " + tbConectividad, null);

		while (cursor.moveToNext()) {
			aux = new Connectivity();
			aux.set_id(cursor.getInt(cursor.getColumnIndex(colIdConectividad)));
			aux.setConnection(cursor.getString(cursor
					.getColumnIndex(colConeccion)));
			aux.setStatus(cursor.getString(cursor.getColumnIndex(colStatus)));
			aux.setFecha(cursor.getString(cursor
					.getColumnIndex(colConectividadFecha)));
			aux.setHora(cursor.getString(cursor
					.getColumnIndex(colConectividadHora)));

			conn.add(aux);
		}

		cursor.close();
		db.close();

		return conn;
	}

	public synchronized void deleteAllConnectivityInfo() {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(tbConectividad, null, new String[] {});
		db.close();
	}

	// MAILS

	public synchronized boolean addMail(Mail mail) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		Long r;

		cv.put(colMailContacto, mail.getContacto());
		cv.put(colMailContactoMail, mail.getMailContacto());
		cv.put(colMailFecha, mail.getFecha().getTime());

		r = db.insert(tbMails, colMailContacto, cv);
		db.close();

		if (r == -1)
			return false;
		return true;
	}

	public synchronized LinkedList<Mail> getAllMailsInfo(String contacto) {
		LinkedList<Mail> mails = new LinkedList<Mail>();
		Mail aux = null;
		SQLiteDatabase db = this.getReadableDatabase();
		String clause = "";
		String selection[] = null;

		if (contacto != null) {
			clause = " WHERE " + colMailContacto + " = ?";
			selection = new String[] { contacto };
		}

		Cursor cursor = db.rawQuery("SELECT * FROM " + tbMails + clause,
				selection);

		while (cursor.moveToNext()) {
			aux = new Mail();
			aux.set_id(cursor.getInt(cursor.getColumnIndex(colIdMail)));
			aux.setContacto(cursor.getString(cursor
					.getColumnIndex(colMailContacto)));
			aux.setMailContacto(cursor.getString(cursor
					.getColumnIndex(colMailContactoMail)));
			aux.setFecha(new Date((cursor.getLong(cursor
					.getColumnIndex(colMailFecha)))));

			mails.add(aux);
		}

		cursor.close();
		db.close();
		return mails;
	}

	public synchronized void deleteAllMails() {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(tbMails, null, new String[] {});
		db.close();
	}

	// MENSAJES WEB

	public synchronized boolean addMsgw(MensajeWeb msgw) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		Long r;

		cv.put(colMsgwContacto, msgw.getContacto());
		cv.put(colMsgwFecha, msgw.getFecha());
		cv.put(colMsgwMensaje, msgw.getMensaje());
		cv.put(colMsgwTipo, msgw.getTipo());
		cv.put(colMsgwOutbox, msgw.getOutbox());
		
		if (msgw.getContactLocation() != null) { 
			Log.d("DEMO_DB", msgw.getContactLocation().getAddress()+" - "+msgw.getContactLocation().getLatitud());
			cv.put(colMsgwLatitude, String.valueOf(msgw.getContactLocation().getLatitud()));
			cv.put(colMsgwLongitude, String.valueOf(msgw.getContactLocation().getLongitude()));
			cv.put(colMsgwAddress, msgw.getContactLocation().getAddress());
		}

		r = db.insert(tbMensajesWeb, colMsgwContacto, cv);

		if (msgw.getTipo() == MensajeWeb.TYPE_RECEIVED) {
			cv.clear();
			cv.put(colFechaUltimoMsgwRecibido, msgw.getFecha());
			db.update(tbFechaUltimoMsgwRecibido, cv, null, null);
		}

		db.close();

		if (r == -1)
			return false;
		return true;
	}

	public synchronized boolean updateMsgw(MensajeWeb msgw) {
		SQLiteDatabase db = this.getWritableDatabase();
		ContentValues cv = new ContentValues();
		int r;

		String whereClause = colIdMsgw + " = ?";
		String whereArgs[] = new String[] { String.valueOf(msgw.get_id()) };

		cv.put(colMsgwFecha, msgw.getFecha());
		cv.put(colMsgwOutbox, msgw.getOutbox());

		r = db.update(tbMensajesWeb, cv, whereClause, whereArgs);

		db.close();

		if (r == -1)
			return false;
		return true;
	}

	public synchronized LinkedList<MensajeWeb> getMsgwByContact(String contacto) {
		LinkedList<MensajeWeb> msgw = new LinkedList<MensajeWeb>();
		MensajeWeb aux = null;
		SQLiteDatabase db = this.getReadableDatabase();
		String clause = colMsgwOutbox + " = ? ";
		String selection[] = new String[] { String
				.valueOf(MensajeWeb.TYPE_INBOX) };
		String contactSelection = colMsgwContacto + " = ? ";
		String groupBy = colMsgwContacto;
		String orderBy = colMsgwFecha + " ASC ";

		if (contacto != null) {
			clause += " and " + contactSelection;
			selection = new String[] { String.valueOf(MensajeWeb.TYPE_INBOX),
					contacto };
		}

		Cursor cursor = db.query(tbMensajesWeb, null, clause, selection,
				groupBy, null, orderBy);

		while (cursor.moveToNext()) {
			aux = new MensajeWeb();
			aux.set_id(cursor.getInt(cursor.getColumnIndex(colIdMsgw)));
			aux.setContacto(cursor.getString(cursor
					.getColumnIndex(colMsgwContacto)));
			aux.setFecha(cursor.getLong(cursor.getColumnIndex(colMsgwFecha)));
			aux.setMensaje(cursor.getString(cursor
					.getColumnIndex(colMsgwMensaje)));
			aux.setTipo(cursor.getShort(cursor.getColumnIndex(colMsgwTipo)));
			aux.setOutbox(cursor.getInt(cursor.getColumnIndex(colMsgwOutbox)));

			ContactLocation location = null;
			String latitude = cursor.getString(cursor.getColumnIndex(colMsgwLatitude));
			String longitude = cursor.getString(cursor.getColumnIndex(colMsgwLongitude));
			
			if(latitude!=null && !latitude.trim().equals("")) {				
				location = new ContactLocation();
				location.setLatitud(Double.parseDouble(latitude));
				location.setLongitude(Double.parseDouble(longitude));
				location.setAddress(cursor.getString(cursor.getColumnIndex(colMsgwAddress)));
			}
			
			aux.setContactLocation(location);				
			
			msgw.add(aux);
		}

		cursor.close();
		db.close();

		return msgw;
	}

	public synchronized LinkedList<MensajeWeb> getMsgwConversation(
			String contacto) {
		LinkedList<MensajeWeb> msgw = new LinkedList<MensajeWeb>();
		MensajeWeb aux = null;
		SQLiteDatabase db = this.getReadableDatabase();
		String clause = colMsgwContacto + " = ? and " + colMsgwOutbox + " = ? ";
		String selection[] = new String[] { contacto,
				String.valueOf(MensajeWeb.TYPE_INBOX) };
		String orderBy = colMsgwFecha + " ASC ";

		Cursor cursor = db.query(tbMensajesWeb, null, clause, selection, null,
				null, orderBy);

		while (cursor.moveToNext()) {
			aux = new MensajeWeb();
			aux.set_id(cursor.getInt(cursor.getColumnIndex(colIdMsgw)));
			aux.setContacto(cursor.getString(cursor
					.getColumnIndex(colMsgwContacto)));
			aux.setFecha(cursor.getLong(cursor.getColumnIndex(colMsgwFecha)));
			aux.setMensaje(cursor.getString(cursor
					.getColumnIndex(colMsgwMensaje)));
			aux.setTipo(cursor.getShort(cursor.getColumnIndex(colMsgwTipo)));
			aux.setOutbox(cursor.getInt(cursor.getColumnIndex(colMsgwOutbox)));

			ContactLocation location = null;
			String latitude = cursor.getString(cursor.getColumnIndex(colMsgwLatitude));
			String longitude = cursor.getString(cursor.getColumnIndex(colMsgwLongitude));
			
			if(latitude!=null && !latitude.trim().equals("")) {				
				location = new ContactLocation();
				location.setLatitud(Double.parseDouble(latitude));
				location.setLongitude(Double.parseDouble(longitude));
				location.setAddress(cursor.getString(cursor.getColumnIndex(colMsgwAddress)));
			}
			
			aux.setContactLocation(location);		
			
			msgw.add(aux);
		}

		cursor.close();
		db.close();

		return msgw;
	}

	public synchronized LinkedList<MensajeWeb> getMsgwOutboxByContact(
			String contacto) {
		LinkedList<MensajeWeb> msgw = new LinkedList<MensajeWeb>();
		MensajeWeb aux = null;

		SQLiteDatabase db = this.getReadableDatabase();
		String clause = colMsgwOutbox + " = ? ";
		String selection[] = new String[] { String
				.valueOf(MensajeWeb.TYPE_OUTBOX) };
		String contactSelection = colMsgwContacto + " = ? ";
		// String groupBy = colMsgwContacto;
		String orderBy = colMsgwFecha + " DESC ";

		if (contacto != null) {
			clause += " and " + contactSelection;
			selection = new String[] { String.valueOf(MensajeWeb.TYPE_OUTBOX),
					contacto };
		}

		Cursor cursor = db.query(tbMensajesWeb, null, clause, selection, null,
				null, orderBy);

		while (cursor.moveToNext()) {
			aux = new MensajeWeb();
			aux.set_id(cursor.getInt(cursor.getColumnIndex(colIdMsgw)));
			aux.setContacto(cursor.getString(cursor
					.getColumnIndex(colMsgwContacto)));
			aux.setFecha(cursor.getLong(cursor.getColumnIndex(colMsgwFecha)));
			aux.setMensaje(cursor.getString(cursor
					.getColumnIndex(colMsgwMensaje)));
			aux.setTipo(cursor.getShort(cursor.getColumnIndex(colMsgwTipo)));
			aux.setOutbox(cursor.getInt(cursor.getColumnIndex(colMsgwOutbox)));

			ContactLocation location = null;
			String latitude = cursor.getString(cursor.getColumnIndex(colMsgwLatitude));
			String longitude = cursor.getString(cursor.getColumnIndex(colMsgwLongitude));
			
			if(latitude!=null && !latitude.trim().equals("")) {				
				location = new ContactLocation();
				location.setLatitud(Double.parseDouble(latitude));
				location.setLongitude(Double.parseDouble(longitude));
				location.setAddress(cursor.getString(cursor.getColumnIndex(colMsgwAddress)));
			}
			
			aux.setContactLocation(location);		
			
			msgw.add(aux);
		}

		cursor.close();
		db.close();

		return msgw;
	}

	public synchronized int deleteMsgwItem(MensajeWeb msgw) {
		SQLiteDatabase db = this.getWritableDatabase();
		String where = colIdMsgw + " = ? ";
		String selectionArgs[] = new String[] { String.valueOf(msgw.get_id()) };

		int count = db.delete(tbMensajesWeb, where, selectionArgs);
		db.close();

		return count;
	}

	public synchronized int deleteMsgwConversation(MensajeWeb msgw) {
		SQLiteDatabase db = this.getWritableDatabase();
		String where = colMsgwContacto + " = ? ";
		String selectionArgs[] = new String[] { msgw.getContacto() };

		int count = db.delete(tbMensajesWeb, where, selectionArgs);
		db.close();

		return count;
	}

	public synchronized void deleteAllMsgw() {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(tbMensajesWeb, null, new String[] {});
		db.close();
	}

	public synchronized String lastMsgwTimestamp() {
		SimpleDateFormat dateFormat = new SimpleDateFormat(
				"dd/MM/yyyy HH:mm:ss");

		SQLiteDatabase db = this.getReadableDatabase();
		Cursor cursor = db.rawQuery("SELECT * FROM "
				+ tbFechaUltimoMsgwRecibido, null);

		cursor.moveToFirst();
		String timestamp = dateFormat.format(new Date(cursor.getLong(cursor
				.getColumnIndex(colFechaUltimoMsgwRecibido))));
		Log.i("lastMsgwTimestamp", "Fecha: " + timestamp);

		cursor.close();
		db.close();

		return timestamp;
	}

	public synchronized LinkedList<MsgwWidgetContact_backup> getMsgwFiveMostContacted() {
		LinkedList<MsgwWidgetContact_backup> msgwContact = new LinkedList<MsgwWidgetContact_backup>();
		MsgwWidgetContact_backup aux = null;
		SQLiteDatabase db = this.getReadableDatabase();
		String columns[] = new String[] { colMsgwContacto,
				"COUNT(*) as cantMsgw" };
		String groupBy = colMsgwContacto;
		String orderBy = "cantMsgw DESC ";

		Cursor cursor = db.query(tbMensajesWeb, columns, null, null, groupBy,
				null, orderBy);
		Cursor contact;

		int count = 0;
		while (cursor.moveToNext() && count < 5) {
			columns = new String[] { colMsgwTipo, "COUNT(*) as cantMsgw" };
			String clause = colMsgwContacto + " = ? ";
			String selection[] = new String[] { cursor.getString(cursor
					.getColumnIndex(colMsgwContacto)) };
			groupBy = colMsgwTipo;

			contact = db.query(tbMensajesWeb, columns, clause, selection,
					groupBy, null, null);

			aux = new MsgwWidgetContact_backup();
			aux.setName(cursor.getString(cursor.getColumnIndex(colMsgwContacto)));

			while (contact.moveToNext()) {
				Log.i("Consulta Widget",
						"Contacto: "
								+ cursor.getString(cursor
										.getColumnIndex(colMsgwContacto))
								+ " Tipo: "
								+ contact.getString(contact
										.getColumnIndex(colMsgwTipo))
								+ " Cantidad Mensajes: "
								+ contact.getString(contact
										.getColumnIndex("cantMsgw")));

				if (contact.getShort(contact.getColumnIndex(colMsgwTipo)) == MensajeWeb.TYPE_RECEIVED)
					aux.setReceived(contact.getInt(contact
							.getColumnIndex("cantMsgw")));
				else
					aux.setSent(contact.getInt(contact
							.getColumnIndex("cantMsgw")));

			}
			msgwContact.add(aux);
			count++;
		}

		cursor.close();
		db.close();

		return msgwContact;
	}

	public synchronized LinkedList<MensajeWeb> getAllReceivedMessage() {
		LinkedList<MensajeWeb> msgw = new LinkedList<MensajeWeb>();
		MensajeWeb aux = null;
		SQLiteDatabase db = this.getReadableDatabase();
		String clause = colMsgwTipo + " = ? ";
		String selection[] = new String[] { String
				.valueOf(MensajeWeb.TYPE_RECEIVED) };
		String orderBy = colMsgwFecha + " DESC ";

		Cursor cursor = db.query(tbMensajesWeb, null, clause, selection, null,
				null, orderBy);

		while (cursor.moveToNext()) {
			aux = new MensajeWeb();
			aux.set_id(cursor.getInt(cursor.getColumnIndex(colIdMsgw)));
			aux.setContacto(cursor.getString(cursor
					.getColumnIndex(colMsgwContacto)));
			aux.setFecha(cursor.getLong(cursor.getColumnIndex(colMsgwFecha)));
			aux.setMensaje(cursor.getString(cursor
					.getColumnIndex(colMsgwMensaje)));
			aux.setTipo(cursor.getShort(cursor.getColumnIndex(colMsgwTipo)));

			msgw.add(aux);
		}

		cursor.close();
		db.close();

		return msgw;
	}

	// HISTORIAL

	public synchronized void deleteAllLogs() {
		SQLiteDatabase db = this.getWritableDatabase();
		db.delete(tbMensajesWeb, null, null);
		db.delete(tbMails, null, null);
		db.close();
	}

	// TODO FK Constraint en columna contacto (Trigger)
	// TODO Revisar columnas con restriccion de NOT NULL
}
